﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Db.SqlSugar;

/// <summary>
///     SqlSugar二级缓存
/// </summary>
[SuppressSniffer]
public static class SqlSugarCache
{
    /// <summary>
    ///     Neto SqlSugar二级缓存
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="queryable"></param>
    /// <param name="cacheKey">缓存Key</param>
    /// <param name="cacheDurationInSeconds">缓存持续时间（秒）</param>
    /// <returns></returns>
    public static ISugarQueryable<T> AbcWithCache<T>(this ISugarQueryable<T> queryable, string cacheKey = "",
        int cacheDurationInSeconds = int.MaxValue) where T : class, new()
    {
        var sqlSugarDbSetting = AppX.GetConfig<SqlSugarDbSettingOptions>();
        //启用了：是否启用SqlSugar二级缓存
        if (sqlSugarDbSetting?.IsEnableSqlSugarWithCache ?? false)
            return queryable.WithCache(cacheKey, cacheDurationInSeconds);
        return queryable;
    }

    /// <summary>
    ///     Neto SqlSugar二级缓存
    /// </summary>
    /// <param name="queryable"></param>
    /// <param name="cacheDurationInSeconds">缓存持续时间（秒）</param>
    /// <returns></returns>
    public static ISugarQueryable<T> AbcWithCache<T>(this ISugarQueryable<T> queryable,
        int cacheDurationInSeconds = int.MaxValue)
    {
        var sqlSugarDbSetting = AppX.GetConfig<SqlSugarDbSettingOptions>();
        //启用了：是否启用SqlSugar二级缓存
        if (sqlSugarDbSetting?.IsEnableSqlSugarWithCache ?? false)
            return queryable.WithCache(cacheDurationInSeconds);
        return queryable;
    }

    //public static ISugarQueryable<T> WithCacheIF(this ISugarQueryable<T> queryable, bool isCache, int cacheDurationInSeconds = int.MaxValue)
    //{
    //    var sqlSugarDbSetting = AppX.GetConfig<SqlSugarDbSettingOptions>();
    //    //启用了：是否启用SqlSugar二级缓存
    //    if (sqlSugarDbSetting?.IsEnableSqlSugarWithCache ?? false)
    //    {
    //        return queryable.WithCacheIF(isCache, cacheDurationInSeconds);
    //    }
    //    else
    //    {
    //        return queryable;
    //    }
    //}
    // /// <summary>
    // /// 移除sqlsugar 指定实体类型的缓存
    // /// </summary>
    // /// <typeparam name="TEntity">数据库实体名</typeparam>
    // public static void RemoveCacheByContainEntityName<TEntity>(this ISqlSugarClient db)
    // {
    //     try
    //     {
    //         var entityInfo = SqlSugarHelper.Db.EntityMaintenance.GetEntityInfo<TEntity>();
    //
    //         db.RemoveCacheByContainStr(entityInfo.DbTableName);
    //     }
    //     catch (Exception ex)
    //     {
    //         AbcLog.Error(ex, "SqlSugar\\删除缓存");
    //     }
    // }
    //
    // /// <summary>
    // /// 移除sqlsugar 包含指定字符串的 SqlSugar 缓存
    // /// </summary>
    // /// <param name="db"></param>
    // /// <param name="likeString">相似字符串</param>
    // public static void RemoveCacheByContainStr(this ISqlSugarClient db, string likeString)
    // {
    //     try
    //     {
    //         var cacheKeys = CacheX.GetAllCacheKeys("SqlSugarDataCache.");
    //         foreach (var item in cacheKeys.Where(item => item.Contains(likeString)))
    //             CacheX.Remove(item);
    //     }
    //     catch (Exception ex)
    //     {
    //         AbcLog.Error(ex, "SqlSugar\\删除缓存");
    //     }
    // }

    // /// <summary>
    // /// 移除sqlsugar 相关所有缓存
    // /// </summary>
    // /// <param name="db"></param>
    // public static void RemoveAllCache(this ISqlSugarClient db)
    // {
    //     var sqlsugarCacheKeys = CacheX.GetAllCacheKeys("SqlSugarDataCache");
    //     foreach (var sqlsugarCacheKey in sqlsugarCacheKeys) CacheX.Remove(sqlsugarCacheKey);
    // }

    #region 异步

    /// <summary>
    ///     刷新表缓存
    /// </summary>
    /// <param name="db"></param>
    /// <returns></returns>
    public static async Task<List<TEntity>> RefreshTableCacheByEntityAsync<TEntity>(this ISqlSugarClient db)
    {
        var entities = await db.Queryable<TEntity>().WithCache().ToListAsync();
        return entities;
    }

    /// <summary>
    ///     刷新表缓存
    /// </summary>
    /// <param name="db"></param>
    /// <param name="entityName"></param>
    /// <returns></returns>
    public static async Task<List<object>> RefreshTableCacheByEntityNameAsync(this ISqlSugarClient db,
        string entityName)
    {
        var entities = await db.Queryable<object>().AS(entityName).WithCache().ToListAsync();
        return entities;
    }

    #endregion 异步

    #region 同步

    /// <summary>
    ///     刷新表缓存
    /// </summary>
    /// <param name="db"></param>
    /// <returns></returns>
    public static List<TEntity> RefreshTableCacheByEntity<TEntity>(this ISqlSugarClient db)
    {
        var entities = db.Queryable<TEntity>().WithCache().ToList();
        return entities;
    }

    /// <summary>
    ///     刷新表缓存
    /// </summary>
    /// <param name="db"></param>
    /// <param name="entityName"></param>
    /// <returns></returns>
    public static List<object> RefreshTableCacheByEntityName(this ISqlSugarClient db, string entityName)
    {
        var entities = db.Queryable<object>().AS(entityName).WithCache().ToList();
        return entities;
    }

    #endregion 同步
}